﻿ #include "adc.h"
 #include "delay.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//ALIENTEK 精英STM32开发板
//ADC 代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/7
//版本：V1.0
//版权所有，盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
////////////////////////////////////////////////////////////////////////////////// 
	   
		   
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3																	   
void  Adc_Init(void)
{ 	
	GPIO_InitTypeDef  GPIO_InitStructure;
	ADC_InitTypeDef   ADC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);  						    	//开启相应时钟
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);  		//设置ADC分屏因子为6，,72M/6=12M，ADC最大频率不能超过14M
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 		 //PA1设置为模拟输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
	

	ADC_InitStructure.ADC_ContinuousConvMode  = DISABLE;				//单次转换模式
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				//ADC数据右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//不是由外部触发，而是由软件触发
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					//ADC独立模式
	ADC_InitStructure.ADC_NbrOfChannel = 1;								//顺序进行规则转换的ADC通道数目
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;						//单通道模式
	ADC_Init(ADC1,&ADC_InitStructure);	
	
	ADC_Cmd(ADC1,ENABLE);							//使能ADC1
	
	ADC_ResetCalibration(ADC1);						//ADC1执行复位校准
	while(ADC_GetResetCalibrationStatus(ADC1));		//等待校准结束
	ADC_StartCalibration(ADC1);						//ADC1执行校准
	while(ADC_GetCalibrationStatus(ADC1));			//等待校准结束

}				  
u16 Get_Adc(u8 ch)
{
	ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_1Cycles5); 	//设置规则序列通道（第一个转换）以及采样周期（239.5）
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);   		 //开启ADC1软件转换
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));    //等待转换结束
	return ADC_GetConversionValue(ADC1);			 //返回最近一次ADC1转换的结果
}	 

double Get_V(uint8_t ch)
{
	uint16_t adc_In = Get_Adc(ch);
  return (double)adc_In*0.003408f-5.667f;
}

	